package com.bcts.rrh.drawingboard.shapeview;

import android.graphics.Color;
import android.util.Log;

import java.nio.ByteBuffer;
import java.nio.ByteOrder;
import java.nio.FloatBuffer;

import javax.microedition.khronos.opengles.GL10;

public class StLine extends Shape_3d{
    private FloatBuffer mVertexBuffer;//顶点坐标数据缓冲
    private FloatBuffer colorBuffer;
    float x1;float y1;
    float x2;float y2;
    float[] tempVerteices;
    float minX;//x轴最小位置
    float maxX;//x轴最大位置
    float minY;//y轴最小位置
    float maxY;//y轴最大位置
    float minZ;//z轴最小位置
    float maxZ;//z轴最大位置
    float midX;//中心点坐标
    float midY;
    float midZ;
    int mcolor;
    int vCount;//顶点数量
    public StLine(int color,float x1,float y1,float x2,float y2){
        this.mcolor=color;
        int red=Color.red(mcolor);
        int green=Color.green(mcolor);
        int blue=Color.blue(mcolor);
        int alpha=Color.alpha(mcolor);
        this.x1=x1;this.y1=y1;
        this.x2=x2;this.y2=y2;
        vCount=2;
        float[] vertices=new float[]{
            x1,y1,0,
            x2,y2,0
        };
        float[] colors=new float[]{
          red,green,blue,alpha,
          red,green,blue,alpha
        };
        tempVerteices=vertices;
        //创建顶点坐标数据缓存，由于不同平台字节顺序不同，数据单元不是字节的要经ByteBuffer转换
        ByteBuffer vbb=ByteBuffer.allocateDirect(vertices.length*4);//开辟新的内存块
        vbb.order(ByteOrder.nativeOrder());//设置为本地平台的字节顺序
        mVertexBuffer=vbb.asFloatBuffer();//转换为int型缓冲
        mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
        mVertexBuffer.position(0);//设置缓冲区的起始位置

        ByteBuffer cbb=ByteBuffer.allocateDirect(colors.length*4);//开辟新的内存块
        cbb.order(ByteOrder.nativeOrder());//设置为本地平台的字节顺序
        colorBuffer=cbb.asFloatBuffer();//转换为int型缓冲
        colorBuffer.put(colors);//向缓冲区中放入顶点坐标数据
        colorBuffer.position(0);//设置缓冲区的起始位置
    }
    private void resetbuffer(){
        int red=Color.red(mcolor);
        int green=Color.green(mcolor);
        int blue=Color.blue(mcolor);
        int alpha=Color.alpha(mcolor);
        vCount=2;
        float[] vertices=new float[]{
                x1,y1,0,
                x2,y2,0
        };
        float[] colors=new float[]{
                red,green,blue,alpha,
                red,green,blue,alpha
        };
        //创建顶点坐标数据缓存，由于不同平台字节顺序不同，数据单元不是字节的要经ByteBuffer转换
        ByteBuffer vbb=ByteBuffer.allocateDirect(vertices.length*4);//开辟新的内存块
        vbb.order(ByteOrder.nativeOrder());//设置为本地平台的字节顺序
        mVertexBuffer=vbb.asFloatBuffer();//转换为int型缓冲
        mVertexBuffer.put(vertices);//向缓冲区中放入顶点坐标数据
        mVertexBuffer.position(0);//设置缓冲区的起始位置

        ByteBuffer cbb=ByteBuffer.allocateDirect(colors.length*4);//开辟新的内存块
        cbb.order(ByteOrder.nativeOrder());//设置为本地平台的字节顺序
        colorBuffer=cbb.asFloatBuffer();//转换为int型缓冲
        colorBuffer.put(colors);//向缓冲区中放入顶点坐标数据
        colorBuffer.position(0);//设置缓冲区的起始位置
    }

    @Override
    public void drawSelf(GL10 gl) {
        gl.glEnableClientState(GL10.GL_VERTEX_ARRAY);//启用顶点坐标数组
        gl.glEnableClientState(GL10.GL_COLOR_ARRAY);
        gl.glEnable(GL10.GL_BLEND);
        gl.glEnable(GL10.GL_LINE_SMOOTH);
        gl.glVertexPointer(//为画笔指定顶点坐标数据
                3,//每个顶点的坐标数量为3
                GL10.GL_FLOAT,//顶点坐标值的类型为GL_FIXED,整型
                0,//连续顶点坐标数据直接的间隔
                mVertexBuffer//顶点坐标来源
        );
        gl.glColorPointer(4, GL10.GL_FLOAT,0, colorBuffer);
        gl.glLineWidth(3f);
        gl.glDrawArrays
                (
                        GL10.GL_LINE_STRIP, 		//以三角形方式填充
                        0, 			 			//开始点编号
                        vCount					//顶点数量
                );
        gl.glDisableClientState(GL10.GL_COLOR_ARRAY);
        // 取消顶点设置
        gl.glDisableClientState(GL10.GL_VERTEX_ARRAY);

        //绘制结束
        gl.glFinish();
    }

    @Override
    public float[] findMinMax() {

        // TODO Auto-generated method stub
        for(int i=0;i<tempVerteices.length/3;i++)
        {
            //判断X轴的最小和最大位置
            if(tempVerteices[i*3]<minX)
            {
                minX=tempVerteices[i*3];
            }
            if(tempVerteices[i*3]>maxX)
            {
                maxX=tempVerteices[i*3];
            }
            //判断Y轴的最小和最大位置
            if(tempVerteices[i*3+1]<minY)
            {
                minY=tempVerteices[i*3+1];
            }
            if(tempVerteices[i*3+1]>maxY)
            {
                maxY=tempVerteices[i*3+1];
            }
            //判断Z轴的最小和最大位置
            if(tempVerteices[i*3+2]<minZ)
            {
                minZ=tempVerteices[i*3+2];
            }
            if(tempVerteices[i*3+2]>maxZ)
            {
                maxZ=tempVerteices[i*3+2];
            }
        }
        Log.d("Ball minX="+minX,"maxX="+(maxX-minX));
        Log.d("Ball minY="+minY,"maxY="+(maxY-minY));
        Log.d("Ball minZ="+minZ,"maxZ="+(maxZ-minZ));
        float[] length={maxX-minX,maxZ-minZ,maxY-minY};

        return length;
    }

    @Override
    public float[] findMid() {
        // TODO Auto-generated method stub
        midX=(minX+maxX)/2;
        midY=(minY+maxY)/2;
        midZ=(minZ+maxZ)/2;
        Log.d("Ball midX=",""+midX);
        Log.d("Ball midY=",""+midY);
        Log.d("Ball midZ=",""+midZ);
        float[] mid={midX,midY,midZ};
        return mid;
    }


    @Override
    public void setMove(boolean flag) {

    }

    @Override
    public void setRotate(boolean flag) {

    }

    @Override
    public void setHilight(boolean flag) {

    }

    @Override
    public void settexture(int texId) {

    }

    @Override
    public boolean getMove() {
        return false;
    }

    @Override
    public boolean getRotate() {
        return false;
    }

    @Override
    public boolean getHilight() {
        return false;
    }

    @Override
    public void Move(float dx, float dy) {

    }

    @Override
    public void Rotate(float dx, float dy,float ox,float oy) {

    }

    @Override
    public void Hilight(float mscale) {

    }

    @Override
    public void setpoint(int pointid, float dx, float dy) {//移动图形某个点
        if(pointid==1){
            this.x1=dx;
            this.y1=dy;
        }
        else if(pointid==2){
            this.x2=dx;
            this.y2=dy;
        }
        //StLine(this.mcolor,x1,y1,x2,y2);
        resetbuffer();
    }

    @Override
    public void setcolor(int color) {
        this.mcolor=color;
    }

    @Override
    public void meActionup() {

    }
}
